package com.qf.shopping.servlet.backController;

import com.alibaba.fastjson.JSON;
import com.qf.shopping.common.Constants;
import com.qf.shopping.common.DisatpcherServlet;
import com.qf.shopping.entity.Page;
import com.qf.shopping.entity.User;
import com.qf.shopping.service.IUserService;
import com.qf.shopping.service.impl.UserServiceImpl;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**处理与用户相关的请求
 * @author 三旬
 * @version 1.0  2022/9/13
 */
@WebServlet("/UserController/*")
public class UserController extends DisatpcherServlet {
    //1.创建访问业务层的接口
    IUserService userService = new UserServiceImpl();
    //2.实现访问的方法

    /**
     * 分页显示数据
     * @return
     */
    public String selectPage(HttpServletRequest request, HttpServletResponse response){
        //获取前端传递的值
        String index = request.getParameter("index");
        String size = request.getParameter("size");
        //实例化分页对象(默认第1页，显示8条记录)
        Page<User> page = new Page<>();
        if(index != null && !"".equals(index)){
            page.setIndex(Integer.valueOf(index));
        }
        if(size != null && !"".equals(size)){
            page.setSize(Integer.valueOf(size));
        }
        //3.调用业务层把所有的数据封装到page对象中
        page.setUrl("UserController/selectPage");
        userService.selectPage(page);
        //4把page对象添加到作用域中
        request.setAttribute("page",page);
        //5.转发到用户列表展示数据
        return Constants.FORWARD+":back/user/userinfo.jsp";
    }

    /**
     * 添加用户
     * @param request
     * @param response
     * @return
     */
    public String addUser(HttpServletRequest request,HttpServletResponse response){
        //调用方法，封装对象
        User user = getFormUser(request);
        //调用业务处理，添加用户
        Boolean flag = userService.add(user);
        //将用户的写操作，抽成一个方法，实现代码的复用性
        return out(flag);
    }

    /**
     * 将用户的写操作，抽成一个方法，实现代码的复用性，因为操作成功都需要返回用户列表
     * @param flag
     * @return
     */
    private String out(Boolean flag) {
        if(flag){
            //操作成功，重定向返回用户信息列表
            return Constants.REDIRECT+":UserController/selectPage";
        }else{
            return Constants.SCRIPT+":操作失败!";
        }
    }

    /**
     * 获取前端传来的用户信息，封装成一个对象
     * @param request
     * @return
     */
    public User getFormUser(HttpServletRequest request){
        //1.接收前端传来的数据
        String id = request.getParameter("id");
        String userName = request.getParameter("userName");
        String passWord = request.getParameter("passWord");
        String  age = request.getParameter("age");
        String sex = request.getParameter("sex");
        String email = request.getParameter("email");
        //2.封装
        User user = new User();
        user.setUserName(userName);
        user.setPassWord(passWord);
        user.setEmail(email);
        if (id != null && !"".equals(id)) {
            user.setId(Integer.valueOf(id));
        }
        if (age != null && !"".equals(age)) {
            user.setAge(Integer.valueOf(age));
        }
        if (sex != null && !"".equals(sex)) {
            user.setSex(Integer.valueOf(sex));
        }
        return user;
    }

    /**
     * 修改用户信息的操作，先接收要修改用户的id，查找用户信息，然后转跳到修改页面，回填信息
     * @param request
     * @param response
     * @return
     */
    public String getUserById(HttpServletRequest request,HttpServletResponse response){
        //1.接收要修改的用户id
        String id = request.getParameter("id");
        //2.调用业务处理，获得用户信息
        User user = userService.selectOneById(Integer.valueOf(id));
        //3.将得到的用户信息存放在request作用域中
        request.setAttribute("user",user);
        //4.转发到修改页面
        return Constants.FORWARD+":back/user/updateuser.jsp";
    }

    /**
     * 修改用户信息
     * @param request
     * @param response
     * @return
     */
    public String updateUser(HttpServletRequest request,HttpServletResponse response){
        //接收前端修改的信息,封装
        User user = getFormUser(request);
        //调用业务层，更新数据
        Boolean result = userService.updateById(user);
        //根据结果给出响应
        return out(result);
    }

    /**
     * 根据id删除用户
     * @param request
     * @param response
     * @return
     */
    public String deleteUserById(HttpServletRequest request,HttpServletResponse response){
        //接收前端要删除的用户id
        String id = request.getParameter("id");
        //调用业务处理，删除该用户
        Boolean result = userService.deleteById(Integer.valueOf(id));
        //根据结果给出响应
        return  out(result);
    }

    /**
     * 删除选中的多条记录
     * @param request
     * @param response
     * @return
     */
    public void delChecked(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //接收前端传来的json数据
        String jsonData = request.getReader().readLine();
        //将接收的json数据转为Integer类型的集合
        List<Integer> list = JSON.parseArray(jsonData,Integer.class);
        //把用户的id集合传给业务层处理
        Boolean result = userService.delChecked(list);
        //创建一个map对象，存放给用户响应的数据
        Map<String,Object> map = new HashMap<>();
        //默认失败
        map.put("code",100);
        //根据结果给出响应
        if (result) {
            map.put("code",200);
        }
        //将map结果转成json字符串给用户响应
        response.getWriter().println(JSON.toJSONString(map));
    }

}
